test <- function(x,y) {
	x + y
}

# from https://stackoverflow.com/questions/2602583/geometric-mean-is-there-a-built-in, supposed to be zero- and NA-tolerant
gm_mean = function(x, na.rm=TRUE){
  exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
}

agg <- function(file, aggregator="n", fun=gm_mean) {
	data<-read.csv(file)
	aggregate(data, by=list(data[,aggregator]), FUN=fun)
}


myplot <- function(data, ylim, ylab, x="n", log=TRUE) {
	if (log) {
		plot(data[,x],data[,x],ylim=ylim,xlim=c(min(data[,x]),max(data[,x])),log="y",type="n",
		xaxs = "i", yaxs = "i", xlab="graph size", ylab=ylab,
		xaxp=c(min(data[,x]),max(data[,x]),length(data[,x])-1),
		yaxp=c(ylim[1],ylim[2],1))
		axis(2, 10^(log10(ylim[1]):log10(ylim[2])), label=FALSE)
		rect(par("usr")[1], 10^par("usr")[3], par("usr")[2], 10^par("usr")[4], col="gray85")
		grid(col="white")
	} else {
		plot(data[,x],data[,x],ylim=ylim,xlim=c(min(data[,x]),max(data[,x])),type="n",
		xaxs = "i", yaxs = "i", xlab="graph size", ylab=ylab,
		xaxp=c(min(data[,x]),max(data[,x]),length(data[,x])-1),
		yaxp=c(ylim[1],ylim[2],4))
	    rect(par("usr")[1],par("usr")[3],par("usr")[2],par("usr")[4],col = "gray85")
	    grid(ny=4, col="white")
	}
}

myplot2 <- function(data, ylim, ylab, x="n", log=TRUE) {
	if (log) {
		plot(data[,x],data[,x],ylim=ylim,xlim=c(min(data[,x]),max(data[,x])),log="y",type="n",
		xaxs = "i", yaxs = "i", xlab="graph size", ylab=ylab,
		xaxp=c(0,50,10),
		yaxp=c(ylim[1],ylim[2],1))
		axis(2, 10^(log10(ylim[1]):log10(ylim[2])), label=FALSE)
		axis(1, 1:50, label=FALSE, tck = -0.01)
		rect(par("usr")[1], 10^par("usr")[3], par("usr")[2], 10^par("usr")[4], col="gray85")
		grid(col="white")
	} else {
		plot(data[,x],data[,x],ylim=ylim,xlim=c(min(data[,x]),max(data[,x])),type="n",
		xaxs = "i", yaxs = "i", xlab="graph size", ylab=ylab,
		xaxp=c(0,50,10),
		yaxp=c(ylim[1],ylim[2],4))
		axis(1, 1:50, label=FALSE, tck = -0.01)
	    rect(par("usr")[1],par("usr")[3],par("usr")[2],par("usr")[4],col = "gray85")
	    grid(ny=4, col="white")
	}
}

mylines <- function(data, y, x="Group.1",
		pch=NA, lty=1, col="black", xmax=-1, points=TRUE) {
	if (xmax<0) {
	    xdata = data[,x]
	    ydata = data[,y]
	} else {
	    xdata = data[1:xmax,x]
	    ydata = data[1:xmax,y]
	}
	lines(xdata, ydata, lty=lty, col=col)
	print(ydata)
	if (points) {
	    points(xdata, ydata, pch=pch, col=col)
	}
}

linesFromFile <- function(file, y, aggregator="n", fun=gm_mean,
		pch=NA, lty=1, col="black", xmax=-1) {
	a <- agg(file, aggregator=aggregator, fun=fun)
	mylines(a, y, pch=pch, lty=lty, col=col, xmax=xmax)
}


fullplot <- function(files, legend, filename, y, ylim, ylab, x="n", log=TRUE, legloc="topleft",
		pchs=c(1,2,3,4,5,6,7,8),
		ltys=c(1,1,1,1,1,1,1,1),
		cols=c("black", 139, 30, 36, 142, 454, 552, 636),
		xmax=c(-1,-1,-1,-1,-1,-1,-1), aggFun=NULL, large=FALSE) {
	par(cex=1.3)
	if (is.null(aggFun)) {
	    if (log) {
	    	fun=gm_mean
	    } else {
	    	fun=mean
	    }
	} else {
	    fun=aggFun
	}
	base <- agg(files[1], aggregator=x)
	if (large) {
	    myplot2(base, ylim, ylab, x=x, log=log)
	} else {
	    myplot(base, ylim, ylab, x=x, log=log)
	}
	i=1
	for (file in files) {
		linesFromFile(file, y, aggregator=x, fun=fun, pch=pchs[i],
			lty=ltys[i], col=cols[i], xmax=xmax[i])
		i=i+1
	}
	legend(legloc,legend=legend,pch=pchs,lty=ltys,col=cols)
	dev.copy(pdf,filename)
	dev.off()
}